package com.ftg.learn.chapter09;

/**
 *
 * 今天来聊一下交换排序问题
 * @author KangJx
 * @date 2021/7/14
 */
public class LearnOrder {

    /**
     * 第一种方法
     * 1 for计算数完成
     *      for() for(:)
     */
    public int test(int[] arr){
        int maxVal = Integer.MIN_VALUE;
        for(int i = 0 ,len = arr.length;i < len;i++){
            if(maxVal < arr[i]){
                maxVal = arr[i];
            }
        }
        return maxVal;
    }

    public int test1(int[] arr){
        int maxVal = Integer.MIN_VALUE;
        //forEach
        for(int a : arr){
            maxVal = (maxVal < a)?a:maxVal;
        }
        return maxVal;
    }

    public int[] orderByArr(int[] arr){
        //稳定
        if(arr.length <= 1){
            return arr;
        }

        for(int a = 0,alen = arr.length;a<alen;a++){
            for(int i = 0 ,len = arr.length - 1;i < len - a;i++){
                if(arr[i] > arr[i + 1]){
                    //交换
                    int t = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = t;
                }
            }
        }
        return arr;
    }

    /**
     *
     * @param arr 数组
     * @param by  升 A  |降 D
     * @return
     */
    public int[] order(int[] arr,char by){
        //稳定
        if(arr.length <= 1){
            return arr;
        }

        for(int a = 0,alen = arr.length;a<alen;a++){
            for(int i = 0 ,len = arr.length - 1;i < len - a;i++){
               if('A' == by && arr[i] > arr[i + 1]){
                   swap(arr,i,i+1);
               }else if('D' == by && arr[i] < arr[i+1]){
                   swap(arr,i+1,i);
               }
            }
        }
        return arr;
    }

    /**
     *  单一原则
     * 完一个数组里面两个下标的交换，根据 条件 by
     * @param arr 数组
     * @param a 下标
     * @param b  下标
     */
    public void swap(int[] arr,int a,int b){
       int t = arr[a];
       arr[a] = arr[b];
       arr[b] = t;
    }
}
